/*
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <cerrno>
#include <unistd.h>
#include <cstring>
#include <iostream>
#include <chrono>
#include "MemoryFile.h"
#include "LyLogPrint.h"


MemoryFile::MemoryFile(const char &path) {
    logFilePath = &path;
    pageSize = getpagesize();
    ptr = nullptr;
    actualSaveSize = 0;
    fileSize = 0;
    fileDesc = 0;
    LOGD("内存分页大小 = %i", pageSize);
    initFile();
}

*/
/**
 * 初始化日志文件
 *//*

void MemoryFile::initFile() {
    int position = (int) logFilePath.find_last_of('/');
    const std::string fileDir = logFilePath.substr(0, position + 1);

    bool dirResult = checkAndmkPath(fileDir);
    LOGD("%s 目录创建结果=%s", fileDir.c_str(), dirResult == 1 ? "成功" : "失败");

    */
/*
     * O_RDWR: 表示打开文件时可以进行读写操作。
     * O_CREAT：若文件不存在则创建文件
     * O_CLOEXEC:在执行完文件描述符相关的操作后立即关闭它，避免子进程继承该文件描述符。
     * S_IRWXU:权限位，表示文件所有者具有读、写和执行权限，而其他用户只有读和执行权限
     *//*

    fileDesc = open(logFilePath.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, S_IRWXU);

    if (fileDesc < 0) {
        LOGD("文件打开失败。%s", logFilePath.c_str());
        return;
    }

    // 申明一个结构体，名字叫做 st
    struct stat st = {};
    // 由文件描述符取得文件状态，成功返回0，失败返回－1
    int stateResult = fstat(fileDesc, &st);
    if (stateResult != -1) {
        fileSize = (int) st.st_size;
        LOGD("文件大小=%i", fileSize);
    }

    bool newFile = fileSize == 0;
    // 如果文件大小不足 一页的大小或者不满最后一页，也需要强行占用一整页的空间。
    if (fileSize < pageSize || fileSize % pageSize != 0) {
        int roundSize = ((fileSize / pageSize) + 1) * pageSize;
        if (reChangeFileSize(roundSize)) {
            fileSize = roundSize;
        }
    }

    bool mmapResult = mmapFile();
    showLog("文件映射结果=%s", mmapResult ? "成功" : "失败");

    if (newFile) {
        LOGD("该文件是新文件，ptr无需偏移");
    } else {
        LOGD("该文件不是新文件，需要偏移以实现追加保存");
        actualSaveSize = fileSize;
        ptr = (uint8_t *) (&fileSize);
    }

}


*/
/**
 * 新建指定的文件夹
 *//*

bool MemoryFile::checkAndmkPath(std::string path) {
    struct stat stResult = {};
    // stat()用来将参数file_name 所指的文件状态, 复制到参数buf 所指的结构中。执行成功则返回0，失败返回-1
    bool fileState = stat(path.c_str(), &stResult);
    LOGD("文件状态fileState=%i", fileState);

    if (fileState == 0) {
        if (!S_ISDIR(stResult.st_mode)) {
            // 获取状态成功，判断path非目录，则也失败
            LOGD("初始化路径异常， %s : %s", path.c_str(), strerror(ENOTDIR));
            return false;
        }

    } else {
        // ENOENT表示文件不存在
        if (errno != ENOENT) {
            LOGD("初始化路径异常 %s : %s", path.c_str(), strerror(errno));
            return false;
        }
        if (mkdir(path.c_str(), 0777) != 0) {
            LOGD("创建文件夹异常 %s : %s", path.c_str(), strerror(errno));
            return false;
        }
    }
    return true;
}


*/
/**
 * 文件和内存进行映射
 *//*

bool MemoryFile::mmapFile() {
    // 最重要的就是这个函数 mmap
    ptr = (uint8_t *) mmap(ptr, fileSize, PROT_READ | PROT_WRITE, MAP_SHARED, fileDesc, 0);

    if (ptr == MAP_FAILED) {
        showLog("文件映射失败 [%s], %s", logFilePath.c_str(), strerror(errno));
        ptr = nullptr;
        return false;
    }
    return true;
}


*/
/**
 * 给文件重新指定大小。（根据页大小和文件实际大小去调整最终的文件大小）
 *//*

bool MemoryFile::reChangeFileSize(int size) {
    if (fileSize == size) {
        return true;
    }

    int oldSize = fileSize;
    fileSize = size;

    // 将参数fd指定的文件大小改为参数length指定的大小。执行成功则返回0，失败返回-1
    bool ftruncateFile = ftruncate(fileDesc, fileSize);
    if (ftruncateFile != 0) {
        fileSize = oldSize;
        return false;
    }

    //zeroFillSize(fileSize - oldSize);

    // 取消参数 addr 所指的映射内存起始地址，参数  __size 则是欲取消的内存大小。
    munmap(ptr, oldSize);
    return true;
}

*/
/**
 * 将指定的内容写到文件中
 *//*

bool MemoryFile::writeLog(const char *msg) {
    int logSize = (int) strlen(msg);

    if (actualSaveSize + logSize > fileSize) {
        LOGD("文件已经存储满了，请额外处理");
        //growFileSize();
        return false;
    }

    memcpy(ptr + actualSaveSize, msg, logSize);
    actualSaveSize += logSize;

    return true;
}
*/
